package com.czk.utils;

import com.czk.domain.Constants;
import com.czk.domain.FileBurstData;
import com.czk.domain.FileBurstInstruct;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * @Author:ChenZhangKun
 * @Date: 2021/4/23 11:47
 */
public class FileUtil {
    public static FileBurstData readFile(String fileURL, Integer readPosition) throws IOException {
        File file = new File(fileURL);
        // 创建可标记读取对象
        RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r");
        // 找到标记点
        randomAccessFile.seek(readPosition);
        // 创建缓冲区域
        byte[] buffer = new byte[1024 * 100];
        int read = randomAccessFile.read(buffer);
        if (read <= 0) {
            // 关闭流
            randomAccessFile.close();
            // 结束
            FileBurstData fileBurstData = new FileBurstData();
            fileBurstData.setStatus(Constants.FileStatus.COMPLETE);
            return fileBurstData;
        }
        FileBurstData fileBurstData = new FileBurstData();
        // 封装
        fileBurstData.setFileName(file.getName());
        fileBurstData.setFileUrl(fileURL);
        fileBurstData.setBeginPos(readPosition);
        fileBurstData.setEndPos(readPosition + read);
        // 不足1024需要拷贝去掉空字节
        if (read < 1024 * 100) {
            byte[] bytes = new byte[read];
            System.arraycopy(buffer, 0, bytes, 0, read);
            // 将读到的数据拷贝到对象中
            fileBurstData.setBytes(bytes);
            // 此时应该结束
            fileBurstData.setStatus(Constants.FileStatus.END);
        } else {
            // 此时还要传
            fileBurstData.setStatus(Constants.FileStatus.CENTER);
            // 将读到的数据拷贝到对象中
            fileBurstData.setBytes(buffer);
        }
        randomAccessFile.close();
        return fileBurstData;
    }
    public static FileBurstInstruct writeFile(String baseUrl,FileBurstData fileBurstData) throws IOException{
        if (fileBurstData.getStatus()==Constants.FileStatus.COMPLETE){
            FileBurstInstruct fileBurstInstruct=new FileBurstInstruct();
            fileBurstData.setStatus(Constants.FileStatus.COMPLETE);
            return fileBurstInstruct;
        }
        // 写
        File file=new File(baseUrl+"/"+fileBurstData.getFileName());
        RandomAccessFile randomAccessFile=new RandomAccessFile(file,"rw");
        // 移动指针位置
        randomAccessFile.seek(fileBurstData.getBeginPos());
        // 调用了seek（start）方法，是指把文件的记录指针定位到start字节的位置。也就是说程序将从start字节开始写数据
        randomAccessFile.write(fileBurstData.getBytes());
        randomAccessFile.close();

        if (Constants.FileStatus.END == fileBurstData.getStatus()) {
            FileBurstInstruct fileBurstInstruct=new FileBurstInstruct();
            fileBurstInstruct.setStatus(Constants.FileStatus.COMPLETE);
            // Constants.FileStatus ｛0开始、1中间、2结尾、3完成｝
            return fileBurstInstruct;
        }

        // 文件分片传输指令
        FileBurstInstruct fileBurstInstruct = new FileBurstInstruct();
        // Constants.FileStatus ｛0开始、1中间、2结尾、3完成｝
        fileBurstInstruct.setStatus(Constants.FileStatus.CENTER);
        // 客户端文件URL
        fileBurstInstruct.setClientUrl(fileBurstData.getFileUrl());
        // 读取位置
        fileBurstInstruct.setReadPosition(fileBurstData.getEndPos() + 1);
        return fileBurstInstruct;
    }
}
